CS-OpcuaClient¶
Клиент OPC UA для системы Дельта.
Используется для чтения данных из серверов OPC UA и записи их в систему Дельта, либо для записи данных параметров системы Дельта в сервер OPC UA.
Для работы необходим .NET Framework 4.6.1 или .NET Core 2.0.
Аргументы командной строки¶
cs_opcuaclient [#moduleInstance] -r | -u | -run
-
#moduleInstance
Опциональное наименование экземпляра службы.
-
-regserver (-r, -service)
Регистрация службы.
-
-unregserver (-u)
Отмена регистрации службы.
-
-run
Запуск в режиме приложения (а не в режиме службы Windows NT или демона Unix).
Формат конфигурационного файла¶
Конфигурационная службы загружается из папки установки службы из xml-файла cs_opcuaclient.moduleInstance.config
, где moduleInstance
- наименование экземпляра службы.
Если используется экземпляр службы по умолчанию, то имя конфигурационного файла - cs_opcuaclient.config
.
<?xml version="1.0" encoding="utf-8"?> <configuration traceFileSizeLimit="int, bytes" [ 3145728 ] logFileSizeLimit="int, bytes" [ 1048576 ] appCertificate="file_path" > <instances file="configlist_path" > <instance name="string" traceLevel="trace_level" [ Off ] type="inst_type" [ D8RegularInstance ] clientllConstr="clientll_constr" paramDbConstr="paramdb_constr" metaDbConstr="metadb_constr" [ paramDbConstr ] archiveConstr="archive_constr" /> <instance /> ... </instances> <objects> <object name="string" traceLevel="trace_level" [ Off ] /> <opcServer name="string" traceLevel="trace_level" [ Off ] channelTraceLevel="trace_level" [ Off ] url="url_string" reserveUrl="url_string" [ not set ] ignoreDiscovery="true|false" [ false ] securityMode="None|Sign|SignAndEncrypt|Invalid" [ None ] userTokenType="Anonymous|UserName|Certificate|IssuedToken|Kerberos" [ Anonymous ] userName="string" userPassword="string" [ empty ] userCertificate="file_path" [ <configuration>.appCertificate ] dataWatchdog="time_span" debugSimDisconnect="true|false" /> ... </objects> <threads> <thread name="string" traceLevel="trace_level" [ Off ] watchdogPeriod="time_span" [ 10m ] instance="instance_name" object="object_name" > <objectives> <objective name="string" traceLevel="trace_level" [ <thread>.traceLevel ] instance="instance_name" [ <thread>.instance ] object="object_name" [ <thread>.object ] function="string" ( Настройки расписания ) enabled="true|false" [ true ] updateRate="time_span" [ 0s ] schedule="schedule_string" [ not set ] retryDelay="time_span" [ 0s ] minRetryDelay="time_span" [ 0s ] maxRetryDelay="time_span" [ 0s ] retry="int" [ -1 ] itemRetry="int" [ -1 ] ( не используется ) immediate="true|false" [ false ] ( Настройки цикла запросов ) cycleStartPosition="First|Same|Next" [ Next ] cycleErrorAction="Abort|Skip" [ Skip ] cycleRestartRetryCount="int" [ 0 ] > <tasks> <task name="string" traceLevel="trace_level" [ <objective>.traceLevel ] instance="instance_name" [ <objective>.instance ] object="object_name" [ <objective>.object ] function="string" type="string" ( Настройки расписания ) enabled="true|false" [ true ] updateRate="time_span" [ 10s ] schedule="schedule_string" [ not set ] retryDelay="time_span" [ 0s ] minRetryDelay="time_span" [ 30s ] maxRetryDelay="time_span" [ 0s ] retry="int" [ -1 ] itemRetry="int" [ -1 ] ( не используется ) immediate="true|false" [ false ] subscriptionUpdateRate="time_span" [ updateRate ] enablePartialRun="true|false" [ true ] d8IdBase="string" [ not set ] objIdBase="string" [ not set ] srcIdBase="string" [ not set ] ( альтернатива для objIdBase или d8IdBase ) dstIdBase="string" [ not set ] ( альтернатива для objIdBase или d8IdBase ) > <items> <item objId="node_id|node_path" d8Id="local_id|local_sid" d8Type="A|D|V|R" [ A ] d8MetaType="type_shortname" [ not set ] srcId="param_id" ( альтернатива для objId или d8Id ) dstId="param_id" ( альтернатива для objId или d8Id ) objEncoding="encoding" d8Encoding="encoding" srcEncoding="encoding" ( альтернатива для objEncoding или d8Encoding ) dstEncoding="encoding" ( альтернатива для objEncoding или d8Encoding ) nativeType="RuntimeType" [ Null ] paramType="A|D|V|Null" [ Null ] bindingFlags="ParamValueBindingFlags" [ WriteAnyValue ] writeParts="Value|SourceTimestamp|ServerTimestamp|StatusCode|State|Quality|XState" [ Value ] coef="double" [ 1.0 ] coefB="double" [ 0.0 ] shift="int" [ 0 ] mask="uint" [ 0xffffffff ] /> <item ... /> ... </items> </task> <task ... /> ... </tasks> </objective> <objective ... /> ... </objectives> </thread> <thread ... /> ... </threads> </configuration>
Элемент configuration
¶
Атрибуты корневого элемента конфигурации:
-
appCertificate
Путь к файлу, который содержит сертификат приложения (этого экземпляра службы).
Сертификат должен быть сертификатом X509 с закрытым ключом в формате.pfx
.
По умолчанию используется сертификат, загружаемый из ресурсов службы.
Если указано значениеappCertificate="null"
, то сертификат не используется.
-
traceFileSizeLimit
Размер в байтах, до которого ограничивается файл журнала трассировки.
-
logFileSizeLimit
Размер в байтах, до которого ограничивается файл журнала работы службы. Используется только, если журнал работы ведется в текстовом файле.
Элементы instances
¶
Этот элемент либо содержит путь на внешний файл с описанием подсистем, либо содержит само описание в элементах <instance>
.
Из этих подсистем будут загружены и инициализированы только те, на которые ссылаются цели службы, задачи службы и их элементы (<objective>
, <task>
и <item>
).
Чтобы подсистемы загружались из внешнего файла, должен быть указан атрибут:
-
file
Путь до файлаconfiglist
, содержащего описания подсистем.
Элементы instance
¶
Каждый xml-элемент <instance>
означает подключение к подсистеме Дельта. Атрибуты xml-элемента:
-
type
Тип реализации.
-
name
Имя объекта. Используется как идентификатор внутри службы.
-
traceLevel="trace_level"
Уровень трассировки. Определяет то, насколько подробным будет вывод в файл трассировки применительно к событиям этой подсистемы (точнее, подключения к этой подсистеме).
Возможные значения:Off, Critical, Error, Warning, Information, Verbose, Verbose2, Verbose3, Verbose4, All
.
-
clientllConstr
Строка подключения по протоколуClientLL
.
-
paramDbConstr
Строка подключения к БД НСИ.
-
metaDbConstr
Строка подключения к БД мета-информации. По умолчанию считается равнойparamDbConstr
.
-
archiveConstr
Строка подключения к архивной БД.
Элемент может содержать другие атрибуты и вложенные элементы в зависимости от того, какой тип реализации используется.
Элементы objects
¶
Внутри элемента <objects>
содержится описание "объектов службы". Каждый объект - это сущность, представляющая определенный ресурс, используемый службой.
Разновидность ресурса определяется именем xml-элемента, который описывает объект, представляющий этот ресурс. Для описания подключения к OPCUA-серверу используется элемент @<opcServer>.
Элементы opcServer
¶
Каждый элемент <opcServer>
описывает один сервер OPC UA, обрабатываемый службой. Его атрибуты:
-
name
Логическое имя OPC-сервера. Используется для логирования.
-
traceLevel
Уровень трассировки событий, связанных с обработкой этого OPC-сервер.
-
channelTraceLevel
Уровень трассировки событий, связанных с обработкой канала связи с этим OPC-сервером.
-
url
Строка URL OPC-сервера. Содержит адрес, порт и протокол, используемые для подключения к OPC-серверу. На данный момент реализован только протокол OPC TCP, поэтому строка URL должна начинаться сopc.tcp://
Нпример:url="opc.tcp://127.0.0.1:51210"
-
reserveUrl
URL резервного OPC-сервера. Если указанreserveUrl
, то служба будет поочередно менять URL с основного (url
) на резервный при каждой ошибке подключения.
-
ignoreDiscovery
Если включено, то информация о точках подключения (эндпоинтах), получаемая от сервера, имеет меньший приоритет, чем настройки из конфигурационного файла.
-
securityMode
Режим безопасности соединения, который нужно использовать для подключения к серверу.
-
userTokenType
Тип аутентификации на сервере.
-
userName
ДляuserTokenType="UserName"
.
Имя пользователя.
-
userPassword
ДляuserTokenType="UserName"
.
Пароль пользователя.
-
userCertificate
ДляuserTokenType="Certificate"
.
Путь к файлу, который содержит сертификат пользователя для аутентификации на сервере.
Сертификат должен быть сертификатом X509 с закрытым ключом в формате.pfx
.
По умолчанию используется сертификат приложения, пути которого задается в<configuration>.appCertificate
.
-
dataWatchdog
Период сторожевого таймера на приём данных. Если за указанный период времени не будет получено полезной информации, то соединение с OPC-сервером будет полностью переинициализировано.
По умолчанию не используется.
-
debugSimDisconnect
Если"true"
, то соединение с этим OPC-сервером будет принудительно разрываться. Используется для отладки процессов восстановления связи.
Элементы thread
¶
Элемент <thread>
описывает один поток выполнения службы, внутри которого обрабатываются цели и задачи службы. Все такие потоки работают параллельно друг другу.
Атрибуты:
-
name
Логическое имя потока. Используется для логирования.
-
traceLevel
Уровень трассировки событий, связанных с обработкой этого потока. Также используется как значение по умолчанию для уровня трассировки обрабатываемых внутри этого потока целей.
-
watchdogPeriod
Период сторожевого таймера потока. Если процедуры, вызываемые для обработки целей задач внтури этого потока, будут выполняться дольше указанного времени, то поток будет принудительно перезапущен.
-
instance
Имя подсистемы (из<instances>
), которое будет использовано по умолчанию целями, обрабатывыемыми этим потоком.
-
object
Имя объекта службы (из<objects>
), которое будет использовано по умолчанию целями, обрабатывыемыми этим потоком.
Цели, обрабатываемые внутри потока, указываются в элементах <objectives>.<objective>
. Поток в цикле выполняет обработку всех целей последовательно, делает паузу в 500 мс и начинает цикл занова.
При этом обработка цели может состоять только из проверки её внутринних расписаний обработки, если время обработки цели еще не настало.
Элементы objective
¶
Элемент <objective>
описывает цель службы, в рамках которой выполняется набор задач.
Обработка цели службы состоит в выполнении набора задач. За одну итерацию обработки цикла задач выполняется попытка выполнения каждой задачи последовательно по одному разу.
При этом отдельно задаются временные настройки для запуска цикла обработки задач и отдельно для каждой из задач.
Если время выполнения задачи еще не наступило, то её обработка на этом завершается и цикл обработки переходит к следующей задаче.
Все временные настройки, указанные в атрибутах элемента <objective>
относятся только к настройкам для запуска цикла обработки задач.
Атрибуты <objective>
:
-
name
Логическое имя потока. Используется для логирования.
-
traceLevel
Уровень трассировки событий, связанных с обработкой этой цели. Также используется как значение по умолчанию для уровня трассировки обрабатываемых внутри этого потока задач.
-
instance
Имя подсистемы (из<instances>
), которое будет использовано по умолчанию задачами, обрабатывыемыми в рамках этой цели.
-
object
Имя объекта службы (из<objects>
), которое будет использовано по умолчанию задачами, обрабатывыемыми в рамках этой цели.
-
function
Функция цели. Не используется.
-
enabled
Определяет то, разрешено ли выполнение цикла задач.
-
updateRate
Периодичность запуска цикла задач. Если указано расписание, то цикла задач обрабатывается не чаще, чем с периодомupdateRate
.
-
schedule
Расписание запуска цикла задач. См. [ Формат строки расписания ]
-
minRetryDelay
Минимальное время до повторной попытки выполнения цикла задач, после неудачного завершения предыдущей попытки. Время отчситывается от времени начала предыдущей итерации.
Если ноль, то ограничение не используется, а следующая попытка произойдет по обчному расписанию.
-
maxRetryDelay
Максимальное время до повторной попытки выполнения цикла задач, после неудачного завершения предыдущей попытки. Время отчситывается от времени начала предыдущей итерации.
Если ноль, то ограничение не используется, а следующая попытка произойдет по обчному расписанию.
-
retryDelay
Еисл указано, то задает одновременно иminRetryDelay
, иmaxRetryDelay
.
-
retry
Максимальное число неудачных попыток выполнения цикла задач, после которых счетчик повторов сбрасывается, а момент следующей итерации вычисляется по обычному расписанию (так, как если бы последняя попытка завершилась удачно).
Значение -1 означает, что количество попыток не ограничено.
-
immediate
Еслиtrue
, то цикл задач будет принудительно выполнен немедленно на старте потока, после чего флаг принудительного выполнения будет сброшен в случае успешного выполнения операции.
-
cycleStartPosition
Определяет то, с какой задачи начинается выполнение цикла задач.First
- цикл всегда начинается с первой задачи;Same
- цикл начинается с той же задачи, на которой цикл был прерван в прошлый раз;Next
- цикл начинается с задачи, следующей за той, на которой цикл был прерван в прошлый раз (с переходом к началу цикла).
-
cycleErrorAction
Определяет политику обработки ошибок при выполнении задач:Abort
- обработка цикла задач завершается с ошибкой, если при выполнении задачи происходит ошибка;Skip
- если при выполнении задачи происходит ошибка, то цикл переходит к следующей задаче.
-
cycleRestartRetryCount
ЕслиcycleStartPosition="Same"
, то определяет максимальное количество неудачных попыток выполнения цикла задач, после которого цилк задач будет начат с первой задачи.
Элементы task
¶
Элемент <task>
описывает задачу, выполняемую в рамках обработки цели службы.
Атрибуты <task>
:
-
name
Логическое имя задачи. Используется для логирования.
-
traceLevel
Уровень трассировки событий, связанных с обработкой этой задачи.
-
instance
Имя подсистемы (из<instances>
), котороя будет использована для выполнения задачи. В зависимости от типа задачи, указанная подсистема используется либо в качестве источника данных, либо в качестве приемника данных.
-
object
Имя объекта службы (из<objects>
), которояйбудет использована для выполнения задачи. В зависимости от типа задачи, указанный объект используется либо в качестве источника данных, либо в качестве приемника данных.
-
task
Тип задачи.
Для задач, связанных с OPCUA, определены следующие типы: -
ReadCurrent
- чтение (синхронное) из OPCUA, который считается объектом-источником и запись в подсистему Дельта (которая считается объектом-получателем); -
WriteCurrent
- получение данных из подсистемы Дельта (которая считается объектом-источником) и запись в OPCUA (который считается объектом-получателем); -
SubscribeCurrent
- подписка на изменения данных в OPCUA (который считается объектом-источником) и запись в подсистему Дельта (которая считается объектом-получателем); -
TestConnect
- тест соединения.
-
function
Функция задачи.
Для задачи типаTestConnect
для OPCUA определена функцияDump
- создание дампа пространства узлов сервера OPCUA. При успешном выполнении задачи, дамп сохраняется в файл, в выполнение задачи запрещается.
-
enabled
Определяет то, разрешено ли выполнение задачи.
-
updateRate
Периодичность выполнения задачи. Если указано расписание, то задача выполняется не чаще, чем с периодомupdateRate
.
-
schedule
Расписание выполнения задачи. См. [ Формат строки расписания ]
-
minRetryDelay
Минимальное время до повторной попытки выполнения задачи, после неудачного завершения предыдущей попытки. Время отчситывается от времени начала предыдущей итерации.
Если ноль, то ограничение не используется, а следующая попытка произойдет по обчному расписанию.
-
maxRetryDelay
Максимальное время до повторной попытки выполнения задачи, после неудачного завершения предыдущей попытки. Время отчситывается от времени начала предыдущей итерации.
Если ноль, то ограничение не используется, а следующая попытка произойдет по обчному расписанию.
-
retryDelay
Еисл указано, то задает одновременно иminRetryDelay
, иmaxRetryDelay
.
-
retry
Максимальное число неудачных попыток выполнения задачи, после которых счетчик повторов сбрасывается, а момент следующей итерации вычисляется по обычному расписанию (так, как если бы последняя попытка завершилась удачно).
Значение -1 означает, что количество попыток не ограничено.
-
immediate
Еслиtrue
, то задача будет принудительно выполнена немедленно на старте потока, после чего флаг принудительного выполнения будет сброшен в случае успешного выполнения операции.
-
subscriptionUpdateRate
Период обновления данных для подписки. Используется только для задач, использующих подписку на данные в объекте-источнике.
-
enablePartialRun
Определяет, разрешено ли выполнять задачу, если не все элементы задачи готовы (все элементы найдены в объекте-источнике, или у всех элементов задачи имеются достоверные значения и пр.).
-
srcIdBase
Строка, задающая базу для относительных идентификаторов параметров объекта-источника. Будет использована совместно с относительными идентификаторами, указанными в элементах задачи (<item>.srcId
).
-
dstIdBase
Строка, задающая базу для относительных идентификаторов параметров объекта-приемника. Будет использована совместно с относительными идентификаторами, указанными в элементах задачи (<item>.dstId
).
-
d8IdBase
Может быть использовано вместоsrcIdBase
, если подсистемаinstance
- это источник данных.
Может быть использовано вместоdstIdBase
, если подсистемаinstance
- это получатель данных.
Задает число, которое будет прибавлено кLocalId
параметров Дельта, указанных в<item>.d8Id>
.
-
objIdBase
Может быть использовано вместоsrcIdBase
, если объектobject
- это источник данных.
Может быть использовано вместоdstIdBase
, если объектobject
- это получатель данных.
Строка, задающая базу для относительных идентификаторов параметров объекта. Будет использована совместно с относительными идентификаторами, указанными в<item>.objId
.
Для сервера OPCUA (объектовopcServer
) полный идентификатор параметра получается простой конкатенацией<task>.objIdBase
с<item>.objId
.
Элементы item
¶
XML-элемент <item>
описывыет элемент задачи, задавая то, какой параметр объекта-источника использовать, как интерпретировать данные параметра объекта-источника, как их обрабатывать и в какой параметр объекта-получателя нужно данные сохранять.
Атрибуты <item>
:
-
srcId
Идентификатор параметра в объекте-источнике.
Формат зависит от типа объекта.
Может означать относительный идентификатор, если в задаче задано базовое значение -<task>.srcIdBase
.
Если объект-источник - это подсистема Дельта, то вместоsrcId
можно указывать атрибутыd8Id
,d8Type
,d8MetaType
.
Если объект-получатель - это подсистема Дельта, то вместоsrcId
можно указать атрибутobjId
.
-
srcEncoding
Строка определения кодировки значения параметра объекта-источника. См. [ Описание кодирования значения ]
-
dstId
Идентификатор параметра в объекте-получателе.
Формат зависит от типа объекта.
Может означать относительный идентификатор, если в задаче задано базовое значение -<task>.dstIdBase
.
Если объект-получатель - это подсистема Дельта, то вместоdstId
можно указывать атрибутыd8Id
,d8Type
,d8MetaType
.
Если объект-источник - это подсистема Дельта, то вместоdstId
можно указать атрибутobjId
.
-
dstEncoding
Строка определения кодировки значения параметра объекта-получателя. См. [ Описание кодирования значения ]
-
objId
Идентификатор параметра целевого объекта.
Если целевой объект - это сервер OPCUA, тоobjId
- это либоNodeId
узла, либо путь узла, относительно стандартного (для OPCUA) корневого узла.
Строка дляNodeId
узла имеет следующий формат:NodeIdString ::= <NamespaceDef> ";" <LocalNodeId> NamespaceDef ::= "ns=" <NamespaceIndex> LocalNodeId ::= ("i=" <IntId>) | ("s=" <StringId>) | ("g=" <GuidId>) | ("b=" <ByteId>) | ("b64=" <ByteIdBase64>)
Наример:ns=1;i=102 ns=2;s=Folder.Subfolder.Tag01 ns=3;g=879a204b-32c2-42aa-a753-2b747029e50c ns=4;b=6173646667686AD3E1 ns=4;b64=MTJ3c2RlNDM=
ЕслиobjId
не начинается сns=
, то считается что указан путь узла. Путь отсчитывает от узлаSystemNodeIds.Object_RootFolder
(это стандартный корневой узел для дерева узлов OPC-сервера).
Например:Objects/Server/Tank1/Pressure/Chan-A
Здесь символ/
используется как разделитель (обозначает связь к следующему узлу в пути). Его можно экранировать символом&
.
-
objEncoding
Строка определения кодировки значения параметра целевого объекта. См. [ Описание кодирования значения ]
-
d8Id
Целочисленный идентификатор LocalId параметра Дельта.
-
d8Type
Тип параметра Дельта:A
- аналоговыйD
- дискретныйV
- векторныйR
- структурный
-
d8MetaType
Краткое название метатипа параметра Дельта.
-
d8Encoding
Строка определения кодировки значения параметра подсистемы Дельта. Определяется автоматически, если указанd8Type
. См. [ Описание кодирования значения ]
-
nativeType="RuntimeType" [ Null ]
Тип данных (из перечисленияRuntimeType
), который считается нативным для этого элемента. Это такой тип данных, который наиболее удобен/оптимален для работы с этим элементом задачи.
Возможные варианты:Boolean
SByte
Byte
Int16
Int32
Int64
UInt16
UInt32
UInt64
Float
Double
String
- и другие
-
paramType
Тип параметра задачи. Определяет, то как будут обрабатываться данные, поступающие из объекта-источника и записываемые в объект-получатель.
Это не то же самое, что атрибутd8Type
, который является частью идентификатора параметра Дельта наряду сd8Id
иd8MetaType
. Однако, еслиparamType
не задан, аd8Type
определен, то в качестве значенияparamType
будет использовано значениеd8Type
.
Варианиты:A
- аналоговыйD
- дискретныйV
- векторныйNull
- тип не задан
-
bindingFlags="ParamValueBindingFlags" [ WriteAnyValue ]
Настройки передачи значения из объекта-источника в объект-получатель. Может быть комбинацией следующих значений:WriteOnValueChange
- Выполнять запись при изменении значения.WriteOnTimestampChange
- Выполнять запись при изменении метки времени.WriteOnStateChange
- Выполнять запись при изменении состояния.WriteOnXStateChange
- Выполнять запись при изменении расширенного состояния.WriteInitialValue
- Выполнять запись для исходного значения.WriteOnAnyChange
- Выполнять запись при любом изменении.WriteAnyValue
- Выполнять запись любого значения (исходного и каждого, из принимаемых далее).WritePeriodic
- Выполнять запись периодически (а не по изменению).
-
writeParts="Value|SourceTimestamp|ServerTimestamp|StatusCode|State|Quality|XState" [ Value ]
Определяет, какая информация записывается в OPC-узел. Это может быть комбинация значений через вертикальную черту:Value
- значение (числовое значение параметра Дельта)StatusCode
- код статуса (получается конвертированием из статуса параметра Дельта)SourceTimestamp
- исходная метка времени (приравнивается метке времени параметра Дельта)ServerTimestamp
- серверная метка времени (приравнивается метке времени параметра Дельта)State
- статус параметра ДельтаQuality
- качесто параметраXState
- расширенное состояние параметра
-
coef
Коэффициент, на который умножается значение при трансформации.
-
coefB
Коэффициент, который прибавляется к значению при трансформации.
-
shift
Количество битов, на которое сдвигается значение при трансформации. Положительные значения означают сдвиг вправо, отрицательные - влево.
-
mask
Битовая маска, но которую побитово умножается значение при трансформации. Можно задавать в шестнадцатиричной форме.
Поток данных внутри элемента задачи¶
В общем случае обработка элемента задачи выполняется так:- значение принимается от параметра объекта-источника с идентификатором
srcId
; - значение декодируется, исходя из того, что объект-источник отправил его в кодировке
srcEncoding
; - тип значения преобразуется к типу данных
nativeType
с использованиемparamType
; - значение сохраняется в памяти как новое текущее значение элемента задачи;
- выполняется трансформация значения с учетом
coef
,coefB
,shift
,mask
; - тип значения преобразуется к типу, указанному в
dstEncoding
; - значение кодируется кодировкой
dstEncoding
; - значение записывается в параметр объекта-получателя с идентификатором
dstId
.
Некоторые этапы могут отстутствовать в зависимости от настроек.
Если определена трансформация значения, то всегда выполняется прямое преобразование, кроме случае, когда тип задачи установлен как <task>.type="WriteCurrent"
.
Трансформация значений¶
При получении значения x
от OPC-сервера, значение трансформируется в y
перед тем, как оно будет отправлено в Дельта. Применяется следующее преобразование x -> y
(прямое):
при shift >= 0: y = ( (x * coef + coefB) >> shift ) & mask при shift < 0: y = ( (x * coef + coefB) << (-shift) ) & mask
При получении значения y
от Дельта, значение трансформируется в x
перед тем, как оно будет записано в OPC. Выполняется обратное преобразование y -> x
(обратное):
при shift >= 0: x = ( ( (y & mask) << shift ) - coefB ) / coef при shift < 0: x = ( ( (y & mask) >> (-shift) ) - coefB ) / coef
Задачи для OPCUA¶
ReadCurrent
¶
<task type="ReadCurrent">
Выполняется периодическое чтение значений OPC-узлов с помощью OPC-сервиса Read
.
Прочитанные данные отправляются в Дельта в качестве новых текущих значений параметров Дельта, сопоставленных с OPC-узлами.
Если статус полученного значения OPC-узла не является достоверным (Good), то такое значение не записывается в Дельта.
SubscribeCurrent
¶
<task type="SubscribeCurrent">
Создается подписка OPCUA. Для каждой такой задачи создается своя подписка OPCUA, но все они создаются в одной сессии OPCUA.
Атрибут subscriptionUpdateRate
задает запрашиваемый период публикации данных. Если он не задан, то используется значение updateRate
.
OPCUA-сервер может пересмотреть это значение.
Получаемые по подписке значения отправляются в Дельта в качестве новых текущих значений параметров Дельта, сопоставленных с OPC-узлами.
Если статус полученного значения OPC-узла не является достоверным (Good), то такое значение не записывается в Дельта.
WriteCurrent
¶
<task type="WriteCurrent">
Выполняется периодическая запись значений OPC-узлов с помощью OPC-сервиса Write
.
УСТАРЕЛО Запись выполняется по следующему алгоритму. Служба подписывается на изменения значений параметров Дельта, сопоставленных с OPC-узлами в этой группе. Периодически служба проверяет, можно ли в настоящий момент выполнить запись данных. Если для каждого параметра в группе службе известно (уже получено) достоверное значение параметра Дельта (такое, что статус параметра не содержит битов из маски @ErrorMask@), то только тогда служба выполняет попытку записи всех значений в OPC-сервер одним запросом. Вне зависимости от результата выполнения операции записи, служба отмечает имеющиеся значения как обработанные. Следующая попытка записи будет выполнена только когда служба снова получит достоверное значение для каждого из параметров в группе.
TestConnect - Diag
¶
<task type="TestConnect" function="Diag" > <items> <item srcId="FailoverIndex" d8Id="..." d8Type="..." /> </items> </task>Используется для передачи в Дельта диагностической информации. Такой запрос должен содержать только специальные диагностические параметры, для которых определены специальные идентификаторы
srcId
:
FailoverIndex
Значение этого параметра равно 0, если связи нет; 1 - если на связи основной OPC-сервер; 2 - если на связи резервный OPC-сервер.
Метка времени этого параметра приравнивается текущему времени.
TestConnect - Dump
¶
<task type="TestConnect" function="Dump" />
Используется для отладки.
Выполнение задачи заключается в том, что служба пытается получить полное дерево всех узлов сервера OPCUA.
Используемый сервер - это объект-источник задачи, объект-получатель не используется.
Полученная информация сохраняется в текстовый файл в папке выполнения службы.
После удачного выполнения задача деактивируется и больше не повторяется.
Логирование¶
Журнал работы службы может сохраняться в двух местах:- Системный журанл Windows с названием "DeltaLog - D8 OpcuaClient". В этом случае в качестве имени источника событий используется наименование экземпляра службы
moduleInstance
, указанное при регистрации службы. Если экземпляр службы не был указан, то используется имя источника событийcs_opcuaclient
. - Текстовый файл в папке установки службы. В этом случае в качестве имени log-файла используется
cs_opcuaclient.moduleInstance.log
, илиcs_opcuaclient.log
.
Кроме журнала работы служба ведет трассировку менее важных событий, сохраняя их в текстовый файл в папке установки службы. В качестве имени файла трассировки используется cs_opcuaclient.moduleInstance.trace
, или cs_opcuaclient.trace
.
trace_levels
, используемые в конфигурационном файле:
Off
- трассировка выключенаCritical
- трассировка только критических ошибокError
- трассировка всех ошибокWarning
- трассировка ошибок и предупрежденийInformation
- трассировка информационных событий, предупреждений и ошибокVerbose
- подробная трассировкаVerbose2
- отладочная трассировка, уровень 2Verbose3
- отладочная трассировка, уровень 3Verbose4
- отладочная трассировка, уровень 4All
- полная трассировка
Некоторые многострочные сообщения, выводимые в журнал трассировки, ограничиваются по количеству выводимых строк в зависимости от уровня трассировки.
Когда такое ограничение применяется, к сообщению обязательно добавляется строка с многоточием. Чтобы в журнал трассировки записывалось больше строк, нужно увеличить traceLevel
.
Минимальное значения для такого ограничения - это 25 строк. На следующем (более подробном) уровне трассировки будет выводиться в 5 раз больше строк, и так далее.
При traceLevel="All"
огрничение не используется.
История версий¶
0.2.21.0420
- Изменения в ядре OPC.
0.2.21.0406
- Добавлено логирование значений, записываемых в OPCUA.
- Исправлено значение по умолчанию для
writeParts
. Теперь это"Value"
, а было пустое значение. - Добавлен полный синтаксис для относительных путей узлов.
- Исправлена ошибка в обработке записи, которая могла приводить к тому, что записывались не все значения, а только те, что выводились в трэйс.
- Изменена логика подробной трассировки.
0.2.21.0324
- Добавлена обработка
dataWatchdog
во время установки соединения (канала и сессии). - Улучшена обработка
watchdogPeriod
для потоков.
- Добавлена обработка
0.2.21.0319
- Исправлена ошибка, из-за которой значение
reserveUrl
могло не использоваться.
- Исправлена ошибка, из-за которой значение
0.2.21.0303
- Изменения в ядре OPC.
0.2.21.0218
- Улучшена трассировка значений узлов при чтении и подписке. Теперь выводятся идентификаторы узлов как они указаны в конфигурационном файле (раньше выводились служебные дескрипторы).
0.2.21.0209
- Добавлена поддержка указания URL резервного OPC-сервера.
- Добавлен диагностический параметр состояния связи с OPC-сервером.
0.2.20.1222
- Добавлена поддержка относительных идентификаторов Дельта (атрибут
d8IdBase
). - Добавлена возможность загрузки инстансов из внешнего файла
configlist
. - Добавлена поддержка экранирования разделителя в путях узлов OPC UA (символ
/
) с помощью символа&
.
- Добавлена поддержка относительных идентификаторов Дельта (атрибут
0.2.20.1217
- Добавлена задача
TestConnect
и функцияDump
- создание дампа дерева узлов сервера OPCUA. - Добавлена функция запроса
NodeId
узлов у сервера по их путям. - Добавлено кэширование данных, используемых для запросов чтения из OPCUA.
- Добавлена задача
0.2.20.1202
- Служба переведена на стандартную базу для сервисов.
- Изменен формат конфигурационного файла.
- Добавлены различные режимы записи значений параметров.
0.1.20.1111
- Добавлена настройка уровня трассировки для каналов связи OPC.
- Добавлен сторожевой таймер для приема данных.
- Добавлен сторожевой таймер для рабочего потока службы.
0.1.20.1109
- Улучшена реализация восстановления сессии после разрыва связи.
- Базовая поддержка чтения по подписке.
0.1.20.1105
- Добавлено преобразование из типа OPC UA
DateTime
в значение аналогвого параметра в виде OADate. - Добавлено преобразование из типа OPC UA
String
в значение векторного параметра. - Улучшена обработка исключений в ядре.
- Добавлено преобразование из типа OPC UA
0.1.20.1026
- Добавлен вывод кодов ошибок StatusCode в виде текста.
- Исправлена ошибка с удалением очереди сообщений в канале OpcTcp.
0.1.20.1020
- Добавлена поддержка шифрования соединения OPC UA.
- Добавлена поддержка аутентификации парой имя пользователя/пароль и сертификатом X509.
- Добавлена поддержка коэффициентов
coef
иcoefB
для линейной трансформации значеий параметров. - Добавлена поддержка настроек
shift
иmaskB
для побитовой трансформации значеий параметров.
0.0.20.0322
Бета-версия.